package com.ht.api.call.func.impl.init;

import java.util.ArrayList;
import java.util.List;

import com.ht.api.bean.AjaxResult;
import com.ht.api.bean.LoginBean;
import com.ht.api.call.func.IFunctionCall;
import com.ht.api.db.Db;
import com.ht.api.db.DbList;
import com.ht.api.db.Entity;
import com.ht.api.db.exception.HtException;
import com.ht.api.db.util.FunctionUtil;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;

/**
 * 应用初始化
 * @author asq
 * @createTime 2025年4月9日 11:24:42
 */
@Slf4j
public class InitFunctionCall implements IFunctionCall {

	@Override
	public String getName() {
		return "应用初始化";
	}

	@Override
	public JSONObject execute(LoginBean me, JSONObject param, AjaxResult result) {
		// 获取前端指定的appid，有指定，则初始化该应用，否则初始化当前租户下的所有应用
		String paramAppid = param.getStr("appid");
		
		// 生成最终要初始化的应用ID列表
		List<Entity> appList = new ArrayList<>();
		if (StrUtil.isNotBlank(paramAppid)) {
			Entity app = Db.createSqlParser("open_app").findById(paramAppid);
			if (app == null) {
				throw new HtException("appid不存在:" + paramAppid);
			}
			appList.add(app);
		} else {
			// 查询租户下的所有正常状态的应用
			DbList list = Db.createSqlParser("open_app").where("tenant_id", me.getTenantIdStr()).where("status", 1).query();
			appList.addAll(list);
		}
		
		// 遍历所有应用ID，进行初始化
		appList.stream().forEach(app -> {
			// 查找该应用对应的初始化类
			String key = String.format("OpenAppInit_%s", app.getStr("pid"));
			OpenAppInitialization appInit = FunctionUtil.getFunction(key);
			
			// 执行初始化
			String appId = app.getMainId();
			if (appInit != null) {
				log.info("[InitFunctionCall][{}] 开始初始化...", app.getStr("name"));
				appInit.initialization(appId);
			} else {
				log.info("[InitFunctionCall][{}] 无需初始化。", app.getStr("name"));
			}
		});
		
		log.info("[InitFunctionCall]所有应用初始化完毕，应用总数：{}", appList.size());
		
		return null;
	}

}
